#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

/* 被加载的程序所在地址 */
void program_addr()
{
	ssize_t n;
	char buf[1024] = {0};

	n = readlink("/proc/self/exe", buf, sizeof(buf));
	if (n < 0)
	{
		fprintf(stderr, "can't read /proc/self/exe\n");
		return;
	}
	buf[n] = '\0';
	printf("process image file directory: %s\n", buf);
}

/* 进程当前的工作目录:
 * 在/home/lv/ 下调用 ~/code/c++/process/process_path.out 
 *		则进程的工作目录为 /home/lv/
 * 在/ 下调用 ~/code/c++/process/process_path.out 
 *		则进程的工作目录为 /
 * 进程对当前目录的操作即是对工作目录的操作。
 * 比如创建一个新文件,如不指明目录则是创建在工作目录下 
 * 
 * 切换进程的当前工作目录：需要进程的euid具有切换到所对应目录的权限
 * */
void proc_pwd()
{
	char buf[1024] = {0};
	/* 获得进程的工作目录 */
	getcwd(buf, 1024);
	printf("process work directory: %s\n", buf);


	//if (chdir("/root") < 0) /* 没有权限 */
	if (chdir("/usr/local") < 0) 
	{
		perror("change word directory error:");
	}

	/* 获得进程的工作目录 */
	getcwd(buf, 1024);
	printf("process work directory: %s\n", buf);
}
/*
 * chroot必须具有root的身份才能执行，执行後会将跟目录切换到PATH 所指定的地方
 * chroot，即 change root directory (更改 root 目录)。在 linux 系统中，系统默认的目录结构都是以 `/`，即是以根 (root) 开始的。而在 *	使用 chroot 之后，系统的目录结构将以指定的位置作为 `/` 位置。
 * 下面这个程序执行为 sudo ./process_path.out  (需要root权限)
 */
void process_rootd()
{
	system("ls -l /");
	
	/* 改变进程的根目录 */
	if (chroot(".") < 0)
	{
		perror("change root directory error:");
	} else 
	{
		printf("change root directory successfully\n");
	}

	/* 
	 *	原本ls是执行/bin/ls 但是现在/已经改变为我们当前的目录
	 *	新的/下连bin目录下都没有
	 *	所以底下这个语句没有任何效果
	 * */
	system("ls -l /");
}

int main()
{
	//program_addr()
	//proc_pwd();
	process_rootd();
	return 0;
}
